﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using log4net;

namespace GenerateDB
{
    class DatabaseGenerator
    {
        private DatabaseSQLHelper _dbSqlHelper;

        /// <summary>
        /// Константы и "магические" числа программы
        /// </summary>
        private Settings _settings;

        private static readonly ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        /// <summary>
        /// Генератор базы данных по XML схеме
        /// </summary>
        /// <param name="dbInfo">Информация для подключения к базе данных</param>
        public DatabaseGenerator(DataBaseInfo dbInfo)
        {
            this.Init(dbInfo);
        }

        /// <summary>
        /// Инициализация класса
        /// </summary>
        /// <param name="dbInfo">Информация для подключения к базе данных</param>
        private void Init(DataBaseInfo dbInfo)
        {
            _settings = new Settings();
            _dbSqlHelper = new DatabaseSQLHelper(dbInfo);
        }

        /// <summary>
        ///  Генерация базы данных и таблиц
        /// </summary>
        public void Generate()
        {
            _dbSqlHelper.DropDatabase();

            _dbSqlHelper.CreateDatabase();
            _log.Info("База данных создана.");

            _dbSqlHelper.UseDatabase();

            this.CreateSystemTables();
            _log.Info("Таблицы созданны.");

            this.CreateTriggers();
            _log.Info("Триггеры создались");

            _dbSqlHelper.AddTypes();
            _log.Info("Типы добавленны в таблицу Types.");

            this.GenerateGroups();
            _log.Info("Группы созданы.");

            _dbSqlHelper.AddDefaultUser();
            _log.Info("Пользователь по умолчанию добавлен.");
        }

        /// <summary>
        /// Создание системных таблиц. SQL код берется из файла.
        /// </summary>
        private void CreateSystemTables()
        {
            try
            {
                _dbSqlHelper.ApplySQLFromFile(_settings.FileCreateTables);
            }
            catch (IOException ex)
            {
                string error = "Ошибка открытия sql файла создания таблиц.";
                _log.Error(error, ex);
                throw new Exception(error);
            }
        }

        /// <summary>
        /// Создание триггеров на удаление и редактирование записи.
        /// </summary>
        private void CreateTriggers()
        {
            _dbSqlHelper.CreateTriggerDeleting();
            _dbSqlHelper.CreateTriggerUpdating();
        }

        /// <summary>
        /// Генерация таблиц Groups
        /// </summary>
        private void GenerateGroups()
        {
            _dbSqlHelper.AddGroupAdmin();
            _dbSqlHelper.AddGroupUserAndGuest();
        }

        /// <summary>
        /// Добавление журнала в базу данных
        /// </summary>
        public void GenerateJournal(Journal journal)
        {
            _dbSqlHelper.AddNameJournal(journal.Name, journal.Encryption);            
            _dbSqlHelper.AddColumnsJournal(journal.Name,journal.Columns);
            
        }        
    }
}
